プリミティブな 3D オブジェクトを作ってみる ( Android OpenGL フレームワーク “Rajawali” と戯れる #02 )
Android OpenGL フレームワーク "Rajawali" と戯れるシリーズ
第 02 回目は、プリミティブな 3D オブジェクトを作って動かしてみます。
下準備 ( Rajawali プロジェクトの取得 )
github から最新のソースを取得します。
ここでは、Eclipse の EGit プラグイン ( http://www.eclipse.org/egit/ ) を使用します。
[Git] の [Projects from Git] を選択します。
git の URI を入力して [Next] ボタンを押します。
下準備 ( 取得した Rajawali プロジェクトをライブラリとして利用する )
任意の Android プロジェクトを作成します。
( ここでは RajawaliLesson01 とします。 )
作成したプロジェクト設定画面から [Android] メニューを選択して、ビルドターゲットを指定します。
次に、Rajawali を追加するためにダイアログ右端中段下にある [Add] ボタンを押します。
Rajawali が表示されるので選択します。
以上で Rajawali が使用できる状態になりました。
専用の Activity と Renderer の使用
Rajawali には、専用のアクティビティ (RajawaliFragmentActivity) クラスと、OpenGL レンダラ (RajawaliRenderer) クラスが用意されていますので、下記コードのように使用します。
MainActivity.java
package jp.classmethod.sample; import jp.classmethod.sample.renderer.Lesson01Renderer; import rajawali.RajawaliFragmentActivity; import android.os.Bundle; /** * RajawaliFragmentActivity のサブクラス */ public class MainActivity extends RajawaliFragmentActivity { /** * 自前で用意する RajawaliRenderer のサブクラス */ private Lesson01Renderer mRenderer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRenderer = new Lesson01Renderer(this); //レンダラに Rajawali が提供する GLSurfaceView オブジェクトをセット mRenderer.setSurfaceView(mSurfaceView); //アクティビティにレンダラをセット setRenderer(mRenderer); } }
Lesson01Renderer.java
package jp.classmethod.sample.renderer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import rajawali.renderer.RajawaliRenderer; import android.content.Context; /** * RajawaliRenderer のサブクラス */ public class Lesson01Renderer extends RajawaliRenderer { /** * コンストラクタ */ public Lesson01Renderer(Context context) { super(context); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { super.onSurfaceCreated(gl, config); //ここでプリミティブな 3D オブジェクトを作成 //このメソッドを呼び出すと onDrawFrame() メソッドがフレーム毎に実行される startRendering(); } @Override public void onDrawFrame(GL10 glUnused) { super.onDrawFrame(glUnused); //フレーム毎に実行する処理 ( アニメーションなど ) } }
プリミティブな 3D オブジェクトの生成 / 表示
作成したレンダラ内の onSurfaceCreated() メソッド内でオブジェクトを作成します。
Rajawali が提供するプリミティブな 3D オブジェクトクラスには、Cube ( 立方体 )、Plane ( 板 )、Sphere ( 球体 ) などが用意されています。
オブジェクトの生成には new を使用し、表示には addChild() メソッドを使用します。( ActionScript に精通している方には馴染みやすいかと思います )
実際に、3D オブジェクトを生成した表示させたコードは下記のようになります。
Lesson01Renderer.java
package jp.classmethod.sample.renderer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import rajawali.materials.SimpleMaterial; import rajawali.primitives.Cube; import rajawali.primitives.Plane; import rajawali.primitives.Sphere; import rajawali.renderer.RajawaliRenderer; import android.content.Context; /** * RajawaliRenderer のサブクラス */ public class Lesson01Renderer extends RajawaliRenderer { /** * 立方体 */ private Cube mCube; /** * 球体 */ private Sphere mSphere; /** * 板 */ private Plane mPlane; /** * コンストラクタ */ public Lesson01Renderer(Context context) { super(context); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { super.onSurfaceCreated(gl, config); SimpleMaterial material = new SimpleMaterial(); material.setUseColor(true); mCube = new Cube(.5f); mCube.setColor(0xff9900); mCube.setMaterial(material); mCube.setRotX(45); mCube.setRotY(45); mCube.setX(-.5f); mCube.setY(.5f); mSphere = new Sphere(.5f, 12, 12); mSphere.setColor(0x0099ff); mSphere.setMaterial(material); mSphere.setX(.5f); mSphere.setY(.5f); mPlane = new Plane(.7f, .7f, 1, 1); mPlane.setColor(0x9900ff); mPlane.setMaterial(material); mPlane.setY(-.5f); //板ポリを両面化 mPlane.setDoubleSided(true); addChild(mCube); addChild(mSphere); addChild(mPlane); startRendering(); } @Override public void onDrawFrame(GL10 glUnused) { super.onDrawFrame(glUnused); mCube.setRotation(mCube.getRotX() + 1, 0, mCube.getRotZ() + 1); mSphere.setRotation(mSphere.getRotX() + 1, 0, mSphere.getRotZ() + 1); mPlane.setRotation(mPlane.getRotX() + 1, 0, mPlane.getRotZ() + 1); } }
作成した 3D オブジェクトを表示するときには、マテリアル ( 表面材質 ) または、テクスチャを設定する必要があります。
このサンプルでは、Rajawali が提供する SimpleMaterial クラスを使用しました。
出力結果
次回は
マテリアルについて解説します。